<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/include/linux/shrinker.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/include/linux/shrinker.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="Maybe">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_X0xJTlVYX1NIUklOS0VSX0hfMA__"><span class="b">_LINUX_SHRINKER_H</span></a>
<a name="2" /><span class="Maybe">       2:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X0xJTlVYX1NIUklOS0VSX0hfMA__"><span class="b">_LINUX_SHRINKER_H</span></a>
<a name="3" /><span class="Maybe">       3:</span> 
<a name="4" /><span class="Maybe">       4:</span> <span class="k">/*</span>
<a name="5" /><span class="Maybe">       5:</span> <span class="k"> * This struct is used to pass information from page reclaim to the shrinkers.</span>
<a name="6" /><span class="Maybe">       6:</span> <span class="k"> * We consolidate the values for easier extention later.</span>
<a name="7" /><span class="Maybe">       7:</span> <span class="k"> *</span>
<a name="8" /><span class="Maybe">       8:</span> <span class="k"> * The &apos;gfpmask&apos; refers to the allocation we are currently trying to</span>
<a name="9" /><span class="Maybe">       9:</span> <span class="k"> * fulfil.</span>
<a name="10" /><span class="Maybe">      10:</span> <span class="k"> */</span>
<a name="11" /><span class="Maybe">      11:</span> <span class="m">struct</span> <span class="b">shrink_control</span> <span class="f">{</span>
<a name="12" /><span class="Maybe">      12:</span>     <span class="b">gfp_t</span> <span class="b">gfp_mask</span><span class="f">;</span>
<a name="13" /><span class="Maybe">      13:</span> 
<a name="14" /><span class="Maybe">      14:</span>     <span class="k">/*</span>
<a name="15" /><span class="Maybe">      15:</span> <span class="k">     * How many objects scan_objects should scan and try to reclaim.</span>
<a name="16" /><span class="Maybe">      16:</span> <span class="k">     * This is reset before every call, so it is safe for callees</span>
<a name="17" /><span class="Maybe">      17:</span> <span class="k">     * to modify.</span>
<a name="18" /><span class="Maybe">      18:</span> <span class="k">     */</span>
<a name="19" /><span class="Maybe">      19:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">nr_to_scan</span><span class="f">;</span>
<a name="20" /><span class="Maybe">      20:</span> 
<a name="21" /><span class="Maybe">      21:</span>     <span class="k">/* shrink from these nodes */</span>
<a name="22" /><span class="Maybe">      22:</span>     <span class="b">nodemask_t</span> <span class="b">nodes_to_scan</span><span class="f">;</span>
<a name="23" /><span class="Maybe">      23:</span>     <span class="k">/* current node being shrunk (for NUMA aware shrinkers) */</span>
<a name="24" /><span class="Maybe">      24:</span>     <span class="m">int</span> <span class="b">nid</span><span class="f">;</span>
<a name="25" /><span class="Maybe">      25:</span> <span class="f">}</span><span class="f">;</span>
<a name="26" /><span class="Maybe">      26:</span> 
<a name="27" /><span class="Maybe">      27:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_U0hSSU5LX1NUT1BfMA__"><span class="b">SHRINK_STOP</span></a> <span class="f">(</span><span class="f">~</span><span class="c">0UL</span><span class="f">)</span>
<a name="28" /><span class="Maybe">      28:</span> <span class="k">/*</span>
<a name="29" /><span class="Maybe">      29:</span> <span class="k"> * A callback you can register to apply pressure to ageable caches.</span>
<a name="30" /><span class="Maybe">      30:</span> <span class="k"> *</span>
<a name="31" /><span class="Maybe">      31:</span> <span class="k"> * @count_objects should return the number of freeable items in the cache. If</span>
<a name="32" /><span class="Maybe">      32:</span> <span class="k"> * there are no objects to free or the number of freeable items cannot be</span>
<a name="33" /><span class="Maybe">      33:</span> <span class="k"> * determined, it should return 0. No deadlock checks should be done during the</span>
<a name="34" /><span class="Maybe">      34:</span> <span class="k"> * count callback - the shrinker relies on aggregating scan counts that couldn&apos;t</span>
<a name="35" /><span class="Maybe">      35:</span> <span class="k"> * be executed due to potential deadlocks to be run at a later call when the</span>
<a name="36" /><span class="Maybe">      36:</span> <span class="k"> * deadlock condition is no longer pending.</span>
<a name="37" /><span class="Maybe">      37:</span> <span class="k"> *</span>
<a name="38" /><span class="Maybe">      38:</span> <span class="k"> * @scan_objects will only be called if @count_objects returned a non-zero</span>
<a name="39" /><span class="Maybe">      39:</span> <span class="k"> * value for the number of freeable objects. The callout should scan the cache</span>
<a name="40" /><span class="Maybe">      40:</span> <span class="k"> * and attempt to free items from the cache. It should then return the number</span>
<a name="41" /><span class="Maybe">      41:</span> <span class="k"> * of objects freed during the scan, or SHRINK_STOP if progress cannot be made</span>
<a name="42" /><span class="Maybe">      42:</span> <span class="k"> * due to potential deadlocks. If SHRINK_STOP is returned, then no further</span>
<a name="43" /><span class="Maybe">      43:</span> <span class="k"> * attempts to call the @scan_objects will be made from the current reclaim</span>
<a name="44" /><span class="Maybe">      44:</span> <span class="k"> * context.</span>
<a name="45" /><span class="Maybe">      45:</span> <span class="k"> *</span>
<a name="46" /><span class="Maybe">      46:</span> <span class="k"> * @flags determine the shrinker abilities, like numa awareness</span>
<a name="47" /><span class="Maybe">      47:</span> <span class="k"> */</span>
<a name="48" /><span class="Maybe">      48:</span> <span class="m">struct</span> <span class="b">shrinker</span> <span class="f">{</span>
<a name="49" /><span class="Maybe">      49:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="f">(</span><span class="f">*</span><span class="b">count_objects</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">shrinker</span> <span class="f">*</span><span class="f">,</span>
<a name="50" /><span class="Maybe">      50:</span>                        <span class="m">struct</span> <span class="b">shrink_control</span> <span class="f">*</span><span class="b">sc</span><span class="f">)</span><span class="f">;</span>
<a name="51" /><span class="Maybe">      51:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="f">(</span><span class="f">*</span><span class="b">scan_objects</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">shrinker</span> <span class="f">*</span><span class="f">,</span>
<a name="52" /><span class="Maybe">      52:</span>                       <span class="m">struct</span> <span class="b">shrink_control</span> <span class="f">*</span><span class="b">sc</span><span class="f">)</span><span class="f">;</span>
<a name="53" /><span class="Maybe">      53:</span> 
<a name="54" /><span class="Maybe">      54:</span>     <span class="m">int</span> <span class="b">seeks</span><span class="f">;</span>    <span class="k">/* seeks to recreate an obj */</span>
<a name="55" /><span class="Maybe">      55:</span>     <span class="m">long</span> <span class="b">batch</span><span class="f">;</span>    <span class="k">/* reclaim batch size, 0 = default */</span>
<a name="56" /><span class="Maybe">      56:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">flags</span><span class="f">;</span>
<a name="57" /><span class="Maybe">      57:</span> 
<a name="58" /><span class="Maybe">      58:</span>     <span class="k">/* These are for internal use */</span>
<a name="59" /><span class="Maybe">      59:</span>     <span class="m">struct</span> <span class="b">list_head</span> <span class="b">list</span><span class="f">;</span>
<a name="60" /><span class="Maybe">      60:</span>     <span class="k">/* objs pending delete, per node */</span>
<a name="61" /><span class="Maybe">      61:</span>     <span class="b">atomic_long_t</span> <span class="f">*</span><span class="b">nr_deferred</span><span class="f">;</span>
<a name="62" /><span class="Maybe">      62:</span> <span class="f">}</span><span class="f">;</span>
<a name="63" /><span class="Maybe">      63:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_REVGQVVMVF9TRUVLU18w"><span class="b">DEFAULT_SEEKS</span></a> <span class="c">2</span> <span class="k">/* A good number if you don&apos;t know better. */</span>
<a name="64" /><span class="Maybe">      64:</span> 
<a name="65" /><span class="Maybe">      65:</span> <span class="k">/* Flags */</span>
<a name="66" /><span class="Maybe">      66:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_U0hSSU5LRVJfTlVNQV9BV0FSRV8w"><span class="b">SHRINKER_NUMA_AWARE</span></a> <span class="f">(</span><span class="c">1</span> <span class="f">&lt;&lt;</span> <span class="c">0</span><span class="f">)</span>
<a name="67" /><span class="Maybe">      67:</span> 
<a name="68" /><span class="Maybe">      68:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">register_shrinker</span><span class="f">(</span><span class="m">struct</span> <span class="b">shrinker</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="69" /><span class="Maybe">      69:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">unregister_shrinker</span><span class="f">(</span><span class="m">struct</span> <span class="b">shrinker</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="70" /><span class="True">      70:</span> <span class="f">#</span><span class="n">endif</span>
<a name="71" /><span class="True">      71:</span> </pre>
  </body>
</html>
